import logging
import os
import sys
from datetime import datetime
from logging.handlers import RotatingFileHandler
from typing import Optional


class 日志管理器:
    """统一的日志管理器"""
    
    def __init__(self):
        self.日志器: Optional[logging.Logger] = None
        self.日志目录 = "logs"
        self.日志文件名 = f"app_{datetime.now().strftime('%Y%m%d')}.log"
        self._初始化日志系统()
        
    def _初始化日志系统(self):
        """初始化日志系统"""
        try:
            # 创建日志目录
            if not os.path.exists(self.日志目录):
                os.makedirs(self.日志目录)
                
            # 创建主日志器
            self.日志器 = logging.getLogger("主日志器")
            self.日志器.setLevel(logging.DEBUG)
            
            # 创建格式化器
            格式化器 = logging.Formatter(
                '%(asctime)s - %(name)s - %(levelname)s - %(message)s',
                datefmt='%Y-%m-%d %H:%M:%S'
            )
            
            # 创建文件处理器
            文件处理器 = RotatingFileHandler(
                os.path.join(self.日志目录, self.日志文件名),
                maxBytes=10*1024*1024,  # 10MB
                backupCount=5,
                encoding='utf-8'
            )
            文件处理器.setLevel(logging.DEBUG)
            文件处理器.setFormatter(格式化器)
            
            # 创建控制台处理器
            控制台处理器 = logging.StreamHandler(sys.stdout)
            控制台处理器.setLevel(logging.INFO)
            控制台处理器.setFormatter(格式化器)
            
            # 添加处理器
            self.日志器.addHandler(文件处理器)
            self.日志器.addHandler(控制台处理器)
            
            self.日志器.info("日志系统初始化完成")
            
        except Exception as e:
            print(f"日志系统初始化失败: {str(e)}")
            raise
            
    def 获取日志器(self, 名称: str) -> logging.Logger:
        """获取指定名称的日志器
        
        Args:
            名称: 日志器名称
            
        Returns:
            logging.Logger: 日志器实例
        """
        return logging.getLogger(名称)
        
    def 设置日志级别(self, 级别: int):
        """设置日志级别
        
        Args:
            级别: 日志级别 (logging.DEBUG, logging.INFO 等)
        """
        self.日志器.setLevel(级别)
        for handler in self.日志器.handlers:
            handler.setLevel(级别)
            
    def 添加文件处理器(self, 文件名: str, 级别: int = logging.DEBUG):
        """添加新的文件处理器
        
        Args:
            文件名: 日志文件名
            级别: 日志级别
        """
        try:
            处理器 = RotatingFileHandler(
                os.path.join(self.日志目录, 文件名),
                maxBytes=10*1024*1024,
                backupCount=5,
                encoding='utf-8'
            )
            处理器.setLevel(级别)
            处理器.setFormatter(logging.Formatter(
                '%(asctime)s - %(name)s - %(levelname)s - %(message)s',
                datefmt='%Y-%m-%d %H:%M:%S'
            ))
            self.日志器.addHandler(处理器)
            self.日志器.info(f"添加文件处理器: {文件名}")
            
        except Exception as e:
            self.日志器.error(f"添加文件处理器失败: {str(e)}")
            
    def 清理旧日志(self, 天数: int = 30):
        """清理指定天数之前的日志文件
        
        Args:
            天数: 保留的天数
        """
        try:
            当前时间 = datetime.now()
            for 文件名 in os.listdir(self.日志目录):
                文件路径 = os.path.join(self.日志目录, 文件名)
                if os.path.isfile(文件路径):
                    文件时间 = datetime.fromtimestamp(os.path.getctime(文件路径))
                    if (当前时间 - 文件时间).days > 天数:
                        os.remove(文件路径)
                        self.日志器.info(f"删除旧日志文件: {文件名}")
                        
        except Exception as e:
            self.日志器.error(f"清理旧日志失败: {str(e)}")
            
    def 导出日志(self, 开始时间: datetime, 结束时间: datetime, 输出文件: str):
        """导出指定时间范围的日志
        
        Args:
            开始时间: 开始时间
            结束时间: 结束时间
            输出文件: 输出文件路径
        """
        try:
            with open(os.path.join(self.日志目录, self.日志文件名), 'r', encoding='utf-8') as f:
                日志行 = f.readlines()
                
            筛选日志 = []
            for 行 in 日志行:
                try:
                    时间字符串 = 行.split(' - ')[0]
                    日志时间 = datetime.strptime(时间字符串, '%Y-%m-%d %H:%M:%S')
                    if 开始时间 <= 日志时间 <= 结束时间:
                        筛选日志.append(行)
                except:
                    continue
                    
            with open(输出文件, 'w', encoding='utf-8') as f:
                f.writelines(筛选日志)
                
            self.日志器.info(f"日志导出成功: {输出文件}")
            
        except Exception as e:
            self.日志器.error(f"导出日志失败: {str(e)}")
            
# 创建全局日志管理器实例
日志管理器实例 = 日志管理器() 